鱼友真实面经(2) - API 开放项目项目教程 - 编程导航教程

编程导航 - reflux

下面是面试过程中遇到的一些比较有用的题:

项目相关:

我做了三个项目,API、聚合搜索、点评

其中点评就是为了让面试官问我Redis相关的问题,这些网上八股一大堆,卷就完事了。

聚合搜索就负责告诉面试官我懂一点ES和设计模式,能把实现的思路说通就行。

场景题基本都是针对API来问的,招架不住,复盘的时候有了一些思路,希望能给大伙一点启发。

做完这三个项目,需要掌握你用到的技术栈,比如ES、sentinel、dubbo、rabbitMQ等等,使用、基本原理、容错、杂七杂八。然后如果实习了,就换上实习的真项目,结合工作经历,再面对场景题应该会得心应手一点。

八股方面:

推荐多搜集些优秀的八股作者,小林、JavaGuide、竹子爱熊猫、《对线面试官》、廖雪峰、小白Debug、极客时间、黑马等等。每个作者都有擅长的领域,写得好的领域,针对性的看,不然可能会出现由于作者精力有限,某个八股题目写的比较简单,导致面试时被问穿,那么就会被打上深度不够的标签,还是很伤的。

建议:

但,也不要有太大心理压力,朋友们,完成比完美更重要!如果不能记下完美的答案,那至少要记下基本的答案。不要让完美主义影响你的完成速度,这是血的教训哇。

鱼皮的项目多多梳理,有一段时间我还是很怀疑鱼皮项目的含金量的,在什么地方能胜过别人的项目?朋友们,含金量是够够的,不要急着否定,当你觉得你的想法更好时,去实践,如果发现自己只是异想天开、钻牛角尖的时候,就会知道项目的含金量,至少应付实习应该是够的,放心做。

当然,不乏真的有更好的想法,星球里的大佬不是也把自己的实现发出来了吗?去学,去借鉴就好了。自己完成了新的想法之后,开源出来,接收群众的拷打也是不错的方式。鱼皮之后也会走开源的路,大伙就不用自己从0整合扩展项目了,而是可以在前人的基础上扩展,还能学到多人合作的一些规范,感觉很不错。

根据项目问技术栈

1、一条es语句的执行流程

最好说到分片规则、分布式存储、分布式查询的流程

分布式新增:

K88onW8sBsG8olxG-9918f586

解读:

  1. 1)新增一个id=1的文档
  2. 2)对id做hash运算,假如得到的是2,则应该存储到shard-2
  3. 3)shard-2的主分片在node3节点,将数据路由到node3
  4. 4)保存文档
  5. 5)同步给shard-2的副本replica-2,在node2节点(别忘了备份数据!)
  6. 6)返回结果给coordinating-node节点

分布式查询:

  1. scatter phase:分散阶段,coordinating node会把请求分发到每一个分片
  2. gather phase:聚集阶段,coordinating node汇总data node的搜索结果,并处理为最终结果集返回给用户

为什么要把请求分发到每一个分片?因为查询的时候不是用id查,而是用关键字查,根本不知道数据在哪个分片,只能全查。通过协调节点,ES集群对外一致,不管查哪个节点都能查出来。

2、dubbo怎么实现负载均衡

查看:负载均衡 | Apache Dubbo

最好可以把一致性哈希的原理讲清楚:9.4 什么是一致性哈希? | 小林coding

3、单边快排如何实现

  1. 双边快排怎么实现也说一下
  2. 有几种选择基准值的办法?哪种最好
  3. 怎么优化
  4. 非递归怎么写

我的总结有点长,大伙可以直接看我参考的一些文章。

参考1:[排序算法杂谈(四) —— 快速排序的非递归实现 - Gerrard_Feng - 博客园 (](https://www.cnblogs.com/jing-an-feng-shao/p/9118376.html#:~:text=快速排序非递归的过程 快速排序非递归的执行过程中,只需要一个堆栈空间,其运行过程如下: 对原数组进行一次划分,分别将左边的 Record 和 右边的 Record,入栈 stack。 判断 stack 是否为空,若是,直接结束;若不是,将栈顶 Record 取出,进行一次划分。)cnblogs.com[)](https://www.cnblogs.com/jing-an-feng-shao/p/9118376.html#:~:text=快速排序非递归的过程 快速排序非递归的执行过程中,只需要一个堆栈空间,其运行过程如下: 对原数组进行一次划分,分别将左边的 Record 和 右边的 Record,入栈 stack。 判断 stack 是否为空,若是,直接结束;若不是,将栈顶 Record 取出,进行一次划分。)

参考2:快速排序算法优化(基准选取、快速+插入、基数聚集)_快速排序 基准数选取优化-CSDN博客

4、dubbo底层怎么进行rpc调用

Dubbo框架的工作流程如下:

  1. 服务提供者启动时,向注册中心注册自己提供的服务。
  2. 服务消费者启动时,向注册中心订阅自己所需的服务。
  3. 注册中心返回可用的服务地址列表给消费者。
  4. 消费者通过负载均衡算法选择一个服务地址,并向该地址发起调用请求。
  5. 服务提供者接收到请求后,根据请求参数执行相应的业务逻辑,并将结果返回给消费者。

现在还是不知道怎么回答,上面是GPT说的,也就是dubbo的那张经典的流程图。

hNbzoh2tnnTRWZh8-3d7fb705

我倾向于回答动态代理模式+RPC的调用流程:

  1. 在 RPC 框架中,代理可以完成序列化、网络 I/O 操作、负载均衡、故障恢复以及服务发现等一系列操作,而上层调用方只感知到了一次本地调用
  2. Client 首先会调用本地的代理。
  3. Client 端 Proxy 会按照协议(Protocol),将调用中传入的数据序列化成字节流。
  4. 之后 Client 会通过网络(Netty框架),将字节数据发送到 Server 端。
  5. Server 端接收到字节数据之后,会按照协议进行反序列化,得到相应的请求信息。
  6. Server 端 Proxy 会根据序列化后的请求信息,调用相应的业务逻辑。
  7. Server 端业务逻辑的返回值,也会按照上述逻辑返回给 Client 端。
U3cGd5YJsSkrR0me-59432073

5、一个对象创建的流程

  1. 最好能接着说类加载机制
  2. 最好能说出创建对象有几种方式
  3. 反射
  4. 序列化
  5. unsafe类
  6. 实现Cloneable接口重写clone方法

6、sentinel一些原理

  1. 三种限流模式
  2. 整体框架
  3. 熔断降级怎么做
  4. 和Hystrix的区别有哪些

呵呵呵呵,以上只是某家厂的一面,那时候才8月底,对青涩的我来说,简直难死了。

拷打聚合搜索+黑马点评

1、说说聚合搜索平台的实现

2、ES集群怎么搭建?

3、布隆过滤器怎么解决冲突,能删数据吗?(不能)

4、RabbitMQ的原理,怎么实现消息顺序性

5、RabbitMQ怎么负载均衡

6、ZSET底层实现

7、JUC的大部分内容

这场比较常规,顺利通过了。

拷打API

1、为什么不考研

2、dubbo3.0和dubbo2.0最大的区别是什么:Dubbo3 应用级服务发现 | Apache Dubbo

3、dubbo注册时会注册什么数据上去?

4、nacos为什么对于临时实例采用心跳检测,非临时实例采用主动询问?

5、你把nacos同时作为配置中心和注册中心,知道这样有什么坏处不?

6、测试过nacos的并发注册能力吗?为什么nacos能抗住那么高注册?

7、元空间会GC吗?

8、元空间存储哪些数据?

9、垃圾回收器,问了很多

10、JVM调优

其中第四点,面试官告诉我他们测试了之后,区别不大

第6点,当时我记得黑马说能抗10w+,但是面试官告诉我,实际测试并没有那么高。

哈哈,在大佬面前,学生是不是背八股,痕迹还是很明显的,大伙尽量结合着自己的实践说,没实践过就谨慎点。

八股

1、项目介绍

2、微服务的优点

3、Spring默认使用的容器是什么?tomcat的连接数了解吗?

4、Redis的Zset说说特性,底层实现(因为简历上写着,所以经常被问)

5、什么数据需要保存到Redis里?

6、缓存的缺点?怎么进行数据同步?

7、AOP失效的场景有哪些?

8、MySQL主键采用什么结构?为什么要自增,为什么要用int?

9、手撕,16min,小卡壳。

手撕

为什么全是手撕?面了一个小时。

1、手撕单例,记得五种,写到第四种说不用写了。

2、手撕插入排序变种(根据题意)

3、给二叉树中序后序遍历,建二叉树

4、矩阵旋转(力扣原题)

场景题

面了1个小时,基本都是场景题+两道题,不好描述场景。

1、skywalking监控调用链时怎么区分不同实例?怎么传递上下文?

2、Java的序列化有哪几种方式,dubbo的序列化了解吗?你还了解哪些序列化

3、手撕了两题,一道sql,一道力扣mid,具体忘记是什么了。

Java自带序列化、Protocol Buffer、Hessian、JSON、XML,都谈谈吧。

一些场景题(我太不会,欢迎补充):

回答基本是鱼皮的,我不会,我是彩笔

1、AK/SK怎么做的?你SDK是公开的吗?签名算法公开?这会出现什么问题,现在你能想出更好的解决办法吗?

  1. 答:SDK是公开的吗?签名算法公开?当然可公开,不然开发者怎么用,只要秘钥不泄露,就没问题(我被诈了应该)

2、你的注册器模式,需要把Bean对象放入map里对吧?你怎么知道有多少个bean要放入map中?直接改代码吗?你能实现在线可插拔吗?根据需要加Bean进map里

  1. 答:反射、或者通过监听配置的变更来更改 map 内的值(分布式配置中心)

3、你在面试,女朋友在自习,任何一人完成手头的事后都可以先去饭店,现在要求你和女朋友晚上同时吃饭,你和女朋友都是单线程的,请问怎么保证不会有人先吃完饭,而是同时吃?

  1. 我的回答:使用消息队列,先到的人(比如女朋友)发送消息给消息队列,然后另一个人(我)完成手头的任务后就消费该消息,前往餐厅,女朋友设置回调函数,当我到达餐厅后,女朋友触发回调,就知道我到来了。

4、我们生成了一个随机数作为接口调用是否过期的判断,这个随机数是客户端生成的本地时间,本地时间可能出现不准确,怎么办?

  1. 我的回答:每次都向服务端发起统一的请求,获得统一的时间

4.2、追问时间有偏差怎么办?我要很准确的时间。

  1. 答:设置一个容错的窗口,在一定范围内的误差都可以忍受

4.3、追问每次都生成这个随机数太慢了,你有什么办法优化?

  1. 答:缓存一些随机数

5、你的sdk怎么适配其他语言的项目?鱼皮的回答:鹅厂的做法是,一个语言一个sdk?

其他八股:

1、HTTPS的演变流程说一下,有几个版本?怎么建立连接的、流程是什么?用到了哪些非对称加密算法,对比一下它们,RSA怎么进行加密的、怎么生成随机数的?ECDHE为什么前向安全?具体的加密公式是什么

2、类上加static是为什么?

3、怎么优雅的中断一个线程?

4、Redis为什么一般用单库?分片集群下lua脚本有什么问题?什么时候会失效

10月22秋招基本结束,后面的面笔大部分都拒了,只面了三家还在流程中的比较大的厂。

YyDSFi2gJsxFoelK-cd0c733f

华为

一面50min:

1、手撕:Excel表字母列转对应数字列,也就是:26进制转10进制,10进制转26进制,0需要特判。

2、Spring里的核心配置是啥?

3、数据库三范式了解吗?

二面40min:

1、手撕:反转链表 II

三面30min:

表现得牛马一点就行了。

碎碎念:面的时候已经摆烂一个星期了,虽然很快就放我入池了,但难道其实一面就挂了?因为后面都没问啥难的,也没给我打保温电话,伤心。

秋招倒数第二面:

1、Java的hashmap底层

2、红黑树的5个特点、怎么旋转保持这些特点?

3、红黑树的应用场景

4、为什么innoDB用B+树不用红黑树

5、三层B+树能存多少行数据?

6、这个存储量受每行数据大小影响吗?

7、联合索引如何实现?

8、命中主键索引和命中非主键索引有什么区别?(好吵阿,面试官那边,好像在居家办公?)

9、问了一些项目内容,给了一道场景题

nginx+网关集群提升网关吞吐量时,需要在nginx里配置网关ip和端口,请问你有什么办法上线一个节点下线一个节点自动知道它的ip?(不会,提示我有点类似nacos,然后就...或许会了)

10、口撕:n个升序列表,合并成一个升序列表。

没写过...尴尬

  1. 1号链表和2号链表合并成新1号链表,新1号再和3号继续合并,以此类推。时间复杂度分析,优化
  2. 突然发现有点像归并排序,说了一些归并的思路,时间复杂度分析,继续问有没有其他思路
  3. 把所有节点保存在集合中,然后调用sort,比较暴力
  4. 看我实在想不出,提示可以用优先队列...然后让我说了一下优先队列的思路

秋招最后一面:

1、场景题:一次性调用多个接口,对于接口返回的data,怎么去组合?要求灵活易扩展,最好零代码

  1. 这个刚好是面试官他们在解决的问题,提示我需要设置统一的规则。

2、RPC和HTTP对比?RPC有什么缺点?

3、netty是什么IO?底层框架说一下

4、场景题:异步解构时,有短板效应,怎么优化?

5、场景题:异步解构时,某些接口调用出现异常怎么办?(不会,没遇到过,现场想了一些)

  1. 响应优先,就把异常接口的错误响应码和正常接口的正常数据打包返回,让用户决定是否使用这个数据
  2. 异常接口重试,重试成功那就返回完整正确结果,多次重试还是失败,直接返回这次调用(包含多个接口调用)失败的响应码

6、追问:如果我需要出现异常调用,直接停止主线程,直接返回这次调用的失败响应码,怎么办?

  1. 答:用消息队列,尽量让主线程自然停止,直接中断会出大问题。

7、设计模式几大原则

8、单一职责原则,有没有不需要遵守该原则的场景?

8.1、我说了一下我的理解:单体项目想要简单起见那可以这样搞,或者优化接口调用速度。但最好还是遵循这个原则,因为有利于项目扩展性。

8.2、然后面试官说了他的理解:这个单一原则并不是说只能做一件事,或最小化的事,这是一个抽象的概念,根据你的定义会改变,最重要的是接口的可读性是否统一,简单来说就是,一个接口里做了很多事,但接口的命名或者表达是否明确,这才是单一。提醒我不要太坚持教条化的原则

9、里氏替换原则,能出现父类的地方都能出现子类,但是继承是能改变父类的,比如重写,你怎么理解,这是否违背了里氏替换原则?

9.1、我的理解:比如RPC里用到的代理模式,要对父类增强的情况还是得遵循这个原则的,如果有需要多态的场景或许可以不遵守,根据需求而定。

9.2、面试官也给出了他的理解:这个原则还是很不错的,最好还是遵守,因为这个原则的基本条件是父类足够简单,足够抽象,父类能够被覆盖的只有抽象的部分,我们需要尽量区分父类能够覆盖和不能覆盖的部分。

最后三场面试还是很舒服的,整体偏向于沟通,不会的题也会尽量给出引导和提示,没有那种单纯你问我答的考试的感觉,也没有咄咄逼人高高在上的感觉。

面试的时候有个小诀窍,转移你的目标,比如我们面试,目标肯定是通过,但是这样压力就会很大,可能导致你发挥不好,真的不过的时候,还要emo。这时候转移你的目标,你是去学习,交流,进步的,这是个机会,这样想了之后,我的表现就自然了很多,不会的题就看看能不能从面试官嘴里问出点蛛丝马迹,,过不过,倒是次要的,压力就会小很多。祝大家以后面试都能遇到和善的氛围。

简历

简历:上编程导航多看看别人的简历就可以了,就知道怎么写了。

我倾向的排版:个人资料—>教育背景(包括奖学金、比赛)—>项目—>技术栈

项目:照着鱼皮推荐的写就行了,项目有两个以上,每个写三四点就行了,只有一个那就写多点吧。

比赛和评奖评优因人而已,不相关的比赛也尽量放上去,HR面会问问,看看你的团队合作能力。

评奖评优那必须放呀,不然三年书白读了,绩点排名都放,当然要是不太好看就不放了。

社团活动、担任职位,我觉得放不放都可以,毕竟应聘的是技术岗。

我的简历,项目方面有很大的局限性,因为没实习,大伙实习后可以替换为实习的项目。

万事开头难,当我准备了一个半月,第一次写简历的时候,才发现,我还是啥也不会,非常胆怯,只敢写了解。

下面这个是我第一版简历,可以说非常搞笑了,你说你了解,可是到底了解了个啥?太空泛了。

这还是我看两遍星球的简历写法后写的,哈哈哈...

Dxe3Ylq3ZBMPQH0h-7f1785b1

后面就是听从鱼皮建议,多看其他人的简历。当时我逛编程导航,大伙都很优秀,我随便挑了十来份,就挑到了哒哥的,问琴的,他俩做的项目和我一样,然后我就大概知道应该怎么写了。

技术栈,我觉得Java、JVM、JUC、Redis、MySQL,这五个一定得写?毕竟找工作一定会学。其他的就看后续的学习情况,比如我看了小林的计网,HTTPS整个流程还算熟悉,那自然要靠这个打动面试官。

提醒一下,朋友们,八股要经常复习,我摆了之后,下面有几个记得的,我也不确定了。

复习的话就多模拟面试,洗澡的时候自言自语,看看能不能把整个流程讲清楚。技术栈我比较倾向于写了解,比如IOC、AOP,之前我被问穿过一次,不敢写熟悉了。

最后,如果哪里写得有问题在评论区说一下吧,我自己由于灯下黑,找不出问题了。我的简历曾被某大厂面试官打为中等偏下水平,确实和鱼皮大学的简历比起来,略显狗屎,有中等偏下也不错了。轻喷。

ma0lHFIYCA6JjRi5-4ec3c1ad

附上鱼皮大学时的技术栈,那是真的一行顶我十行哈哈哈。

Ftktf2w5TBoPHwxe-b2173371

最后的最后,附上我参考最多的那一份简历,希望自己有天也能那么强:

给这个博主打个广告吧,稀土:竹子爱熊猫,相见恨晚,JUC、JVM讲得非常好,还是免费的,爽。

FfL6NjJGIyqYFy7x-8644b11f

感觉星球的md写起来不是很舒服,不过也整理了好久,希望对大伙有帮助吧。


项目分区导航:⬅️ 17-鱼友真实面经(1) - API 开放项目项目教程 - 编程导航教程 | 18-鱼友真实面经(2) - API 开放项目项目教程 - 编程导航教程 | ➡️ 19-API 开放平台问题答疑 - API 开放项目项目教程 - 编程导航教程